找回密碼
 註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 23818|回復: 58

[輸入法] ZIME/中州韻輸入平臺簡介

[複製鏈接]
發表於 2010-1-10 22:40:06 | 顯示全部樓層 |閱讀模式

大家好,我是佛振。
此番向大家介紹拙作「中州韻」輸入平臺。雖是打小廣告,但哥做的可都是公益。
我非粵人,請恕我在行文中使用國語。

佛振利用賦閒在家的數月時光,寫了籌謀已久的「中州韻」輸入平臺。
我考察優秀拼音輸入法均以強大的智能組句功能而取勝,智能程式的支援對重碼字較多的拼音類輸入法是個很好的補充。然而這也使開發一款新的拼音輸入法成為一項十分複雜的工作。
佛振的思路是教輸入法的語言模型獨立於具體的拼寫方案,支持對輸入法進行深度定制,以實現各種方言、各種拼寫法的輸入方案。如此,便可用較少的步驟實作一款新的拼音輸入法,同時依靠通用的智能程式達到較理想的輸入體驗。
這個平臺最大的用途就是做方言輸入法。只要做好一份字音對照表,乃至完全利用現有方案,只指定一組拼式變換規則,就可以實驗新的拼寫法。這就是佛振做這款輸入平臺的目的。

[ 本帖最後由 佛振 於 2010-1-10 22:41 編輯 ]
 樓主| 發表於 2010-1-10 22:54:47 | 顯示全部樓層
迄今,ZIME計劃已取得兩項主要成果,一是適用於Linux作業系統的ibus-zime,實現了以上預想的各項功能。

二一個是Plume.js網頁輸入平臺,是為了能在各種不同的環境中體驗ZIME輸入法而作,目前只實現了基本的功能。可用它來瞭解中州韻輸入平臺,用來實驗新拼寫法的實際打字效果更是絕佳的工具。

受技術能力所限,佛振目前沒有把ZIME移植到Windows作業系統的計劃。

輸入法平臺是輸入法的支援程式,本身不包含具體的輸入法方案。ZIME的輸入方案是由若干文本文件來定義,並通行於兩款平臺的實現。
[ 本帖最後由 佛振 於 2010-1-11 12:52 編輯 ]
 樓主| 發表於 2010-1-10 23:35:33 | 顯示全部樓層
為測試輸入平臺的實用效果,佛振草擬了一款粵拼輸入方案。乃是由網路下載了一份粵拼字表,由ZIME自動生成詞庫。這樣嘗試了一下,雖然存在多音字誤用的問題,但借助平臺的智能調頻處理輸入體驗仍比較滿意。

ibus-zime演示視頻:(粵拼輸入方案演示在8:12'處)
http://v.youku.com/v_show/id_XMTM4ODkwMzgw.html

Plume.js網頁輸入法

batjansehei-0.jpg

batjansehei-1.jpg


當然,由於佛振不通曉粵語,故而不能發現方案中的問題,也無法將這一方案完善。我知道粵語研究與應用的氛圍最好,所以把拙作介紹給大家。
希望有興趣的朋友一起來研究。

ZIME計劃主頁
http://zime.googlecode.com/

提供下載:ibus-zime(Linux輸入法)、Plume.js(網頁輸入法程式)、用於網頁輸入法的資料文件(粵拼輸入方案)。
中州韻輸入平臺為開源軟件,以GPLv3釋出。歡迎參與開發,志願者請致函:佛振 <chen.sst@gmail.com>

再回找個時間,向大家詳細介紹輸入法的操作,以及修改和製作輸入方案的方法。論壇上不少朋友有自己的拼寫法設計,用ZIME來將已有的粵拼方案通過拼寫變換映射為新的拼寫法來試試看,符號標調也有辦法喔。

總之,願這款軟件對大家有用。
[ 本帖最後由 佛振 於 2010-1-11 12:52 編輯 ]
發表於 2010-1-11 17:03:06 | 顯示全部樓層
想法很好,多謝樓主的工作。試用了網頁版,可用。LINUX版要等我裝了LINUX後再試。只是未曉如何自製輸入法。
 樓主| 發表於 2010-1-11 17:15:17 | 顯示全部樓層
原帖由 JUMPSEY 於 2010-1-11 17:03 發表 想法很好,多謝樓主的工作。試用了網頁版,可用。LINUX版要等我裝了LINUX後再試。只是未曉如何自製輸入法。


先等等看。佛振正有些手忙腳亂。自製的方法,佛振打盤就penkyamp君的拼寫法做出一個小教程來介紹。
 樓主| 發表於 2010-1-11 17:41:15 | 顯示全部樓層

註:此專題講解的輸入文件非ZIME定義文件的最新格式,請參考ZIME計劃主頁上的最新資料

【專題一】利用ZIME輸入方案中的拼寫變換機制

本專題以Penkyamp拼寫法為例,講述如何以Jyutping輸入方案為起點,定制新的ZIME輸入方案。
此方法適用於這樣的需求:
新的拼寫法與已有方法基於相同的音系,譬如本例中Penkyamp與Jyutping同為基於標準粵語的拼寫法;
並且,兩種拼寫法的拼式無一對多的情況,最好能夠做到一一對應,譬如原方案是無聲調標注的,就無法用來實現區分聲調的新方案;
新的拼寫法與原拼寫法存在對應規律,或無規律但數目不大足以窮舉。

ZIME的輸入方案是以文本形式定義,而後用平臺提供的腳本來編譯成輸入法軟件易於讀取的格式。
以文本形式定義的輸入方案可通行於所有ZIME計劃中的輸入法。此番以網頁輸入平臺Plume.js來做演示。

先看看方案定義文件長什麼樣。下載以下文件:
http://zime.googlecode.com/svn/trunk/plume/data/jyutping-schema.txt
http://zime.googlecode.com/svn/trunk/plume/data/jyutping-keywords.txt
http://zime.googlecode.com/svn/trunk/plume/data/jyutping-phrases.txt

一般來講,一個輸入方案由三個文件組成:
xxx-schema.txt 是方案定義,包含各種設定選項。必須。
xxx-keywords.txt 是音節的拼寫形式與單字的對照表。必須。
xxx-phrases.txt 是有詞頻和拼音標注的詞庫文件。可選。且平臺提供了一個工具可依 xxx-keywords.txt 自動生成詞庫。

此役,我只須做一個 penkyamp-schema.txt 文件,而直接借用已有的 Jyutping 方案裡的字表和詞庫。


[ 本帖最後由 佛振 於 2010-1-15 21:11 編輯 ]
 樓主| 發表於 2010-1-11 17:50:53 | 顯示全部樓層
中場休息。
說實話,佛振是一邊寫教程一邊做方案啊,大方向是對的,所以我仍對此很有信心。

作業:前文說到要用工具來編譯新製作的方案。我這工具是一個腳本程序。需要用到Python腳本語言。Python是跨平臺的,Unix-like作業系 統如Linux和Mac OS X一般已經預裝了,Windows使用者需要自行下載安裝 Python 2.6,注意版本是2.6。
 樓主| 發表於 2010-1-11 18:09:50 | 顯示全部樓層
來看 jyutping-schema.txt 文件的內容:
{{{
Schema/Jyutping = 粵拼
Config/Jyutping/Prefix = jyutping
Config/Jyutping/Parser = roman
Config/Jyutping/AutoPrompt = yes
Config/Jyutping/AutoDelimit = yes
Config/Jyutping/Delimiter = [ '-]
Config/Jyutping/MaxKeywordLength = 6
Config/Jyutping/SplitRule = ptkmng aeiou
#Config/Jyutping/SplitRule = n g
Config/Jyutping/SplitRule = gk w
Config/Jyutping/FuzzyRule = ^jyu ju
# punctuation
Config/Jyutping/Punct = , ,
Config/Jyutping/Punct = . 。
Config/Jyutping/Punct = / /
Config/Jyutping/Punct = ? ?
Config/Jyutping/Punct = ; ;
Config/Jyutping/Punct = : :
# ...
Config/Jyutping/Punct = ' 『~』
Config/Jyutping/Punct = " 「~」
# ...
Config/Jyutping/Punct = < 《 〈
Config/Jyutping/Punct = > 》 〉
Config/Jyutping/Punct = [ 「 【 [
Config/Jyutping/Punct = ] 」 】 ]
Config/Jyutping/Punct = { 『 {
Config/Jyutping/Punct = } 』 }
# edit keys
Config/Jyutping/EditKey = comma Page_Up
Config/Jyutping/EditKey = period Page_Down
Config/Jyutping/EditKey = I Up
Config/Jyutping/EditKey = K Down
Config/Jyutping/EditKey = J Left
Config/Jyutping/EditKey = L Right
# ...
}}}

解讀一下此文件的格式:
xxx-schema.txt 文件,內含輸入方案的全部選項,由`Key = VALUE`格式的值定義組成。中間的等號要用西文字符,兩邊各一個空格為善。
如果Key有重複出現的,則表示該Key對應一個值的序列而非單一值。

  1. Schema/Xxx = 某某
複製代碼

向輸入法登記一個名為 Xxx 的輸入方案。輸入法在內部以 Xxx 為其唯一標幟,而在介面上以「某某」顯示。Xxx 推薦用類似`SomeName`首字母大寫的形式。
此役,我複製 jyutping-schema.txt 為 penkyamp-schema.txt,並在後者中把此行改作:
  1. Schema/Penkyamp = Penkyamp方案
複製代碼


接下來所有的
  1. Config/Xxx/OptionYyy = zzz
複製代碼

為針對該方案的各項設定。如果你是在 jyutping-schema.txt 的副本上做修改,請注意把 Config/Jyutping/ 全部替換為 Config/Penkyamp/ 。

【注意】如果你自己建立一個文本文件並開始編輯,請確認文件以UTF-8編碼保存。
[ 本帖最後由 佛振 於 2010-1-11 18:24 編輯 ]
 樓主| 發表於 2010-1-11 19:43:11 | 顯示全部樓層

Hack, hack...

好。任務的關鍵是這些選項的配置。跟我來。

Config/Penkyamp/Prefix = penkyamp

所謂Prefix選項,技術上說是數據庫的前綴,實際意義可以理解為字典名稱。建議用小寫。
你想,輸入法裡配置有多種方案的情況下,每種方案像是不同的語言,對輸入的內容會有不同的解釋,所以要指定去查哪一部字典。「方案」和「字典」是多對一的關係。有的方案可以共用一部字典,比如全拼和簡拼,所以可指定相同的Prefix值。但拼寫形式根本不同的話,就要查不同的字典。此役,這裡取一個不同於 jyutping 的名字 penkyamp。

Config/Penkyamp/Parser = roman

輸入的解析方式。取值有以下機種:
roman    羅馬字方式,即所有拉丁字母組成的不定長拼寫形式,如漢語拼音,粵拼等。
grouping    組鍵方式,是指一個音節由固定數目的部分組成,各部分之間可以任意順序輸入,最後有一個終結碼。比如注音,分聲母、介音、韻母,最後打聲調作為終結碼。
combo    並擊方式,是指可同時按下多個按鍵的組合,以一次擊鍵輸入一個音節。拙作「宮保拼音」就是一個在標準鍵盤上實現多鍵並擊輸入的小發明。
此役,Penkyamp屬於羅馬字拼寫法,用 roman。

Config/Penkyamp/AutoPrompt = yes
Config/Penkyamp/AutoDelimit = yes

輸入法的行為方式,這兩個選項在網頁輸入法中暫時不用。所以寫不寫都中。
AutoPrompt 即時顯示候選菜單,Plume.js的現行版本無此功能,只有擊空格後才出選項。
AutoDelimit 拼寫的同時顯示音節切分,幫助操作者看清楚拼式。Plume.js中默認啟用。

Config/Penkyamp/Delimiter = [ '-]

這是定義起隔音作用的符號,用來消除拼式解讀的歧義。所有符號放在一對 [ ] 裡。特別是裡面的第一個符號,還被用來自動插入在程序判斷出的切分點,以幫助閱讀。

Config/Penkyamp/MaxKeywordLength = 5

所有音節拼式的最大長度。經觀察,Penkyamp 最長的拼式為5個字母,比 Jyutping 要短。

[ 本帖最後由 佛振 於 2010-1-11 19:44 編輯 ]
 樓主| 發表於 2010-1-11 20:45:03 | 顯示全部樓層
SplitRule 音節切分規則,指定在音節邊界不明時如何做默認的切分。現行版本的ZIME輸入法均已不用該選項,而是智能處理所有可能的切分方式。
不寫。

接下來是重點!你的智商現在要用上了。

SpellingRule 和 FuzzyRule,用來對 xxx-keywords.txt 和 xxx-phrases.txt 中的拼式進行變換,從而把原方案轉換為新的拼寫法。
變換是由一系列正則表達式替換操作完成的。我把這項技術稱為「拼寫運算」。
具體來說,假如原方案中有個拼式為"zoeng",現在我要把它變為新方案中對應的拼式"jeong",對應規則是原拼法的元音 oe 改寫為 eo;原拼法的聲母 z 改寫為 j。我便寫兩條SpellingRule:
Config/Penkyamp/SpellingRule = oe eo
Config/Penkyamp/SpellingRule = ^z j
解釋一下:等號後面是兩個表達式,以空格隔開。前一個是要在拼式中匹配的模式,後一個是要替換掉匹配部份的新內容。
這個是程式設計常用的正則表達式,詳見:http://docs.python.org/library/re.html
拼式"zoeng"拿來與第一條規則匹配,結果匹配到了 z 和 ng 之間的部份,於是那部份替換為 eo,拼式變為"zeong",再將這個結果與下一條規則匹配。
第二條規則中的 ^ 有特殊含義,表示匹配必須發生在拼式的開頭位置,用在這裡強調要匹配聲母z。事實上z也不可能出現在拼式的非啟始位置,所以 ^ 也可不用;但對於聲母 m n g p t k w 就是必要的了。
經過替換,"zeong"變成最終合乎新拼寫規則的形式"jeong"。

接下來還可以施以 FuzzyRule。FuzzyRule 與 SpellingRule 類似,但替換前後的拼式均保留在最終的拼寫法中,於是產生了一組相容的拼寫形式,也可用作拼式糾錯,如:
Config/Penkyamp/FuzzyRule = ng gn
會得到一組新拼寫形式 dogn togn logn ... gno ...,輸入它們與輸入 dong tong long ... ngo ... 等效。

倘若經過 FuzzyRule 變換得到的拼式與某個已有拼式相同,則這一拼式可兼表原方案中的兩個拼式,可稱此為模糊音處理。
譬如:
Config/Penkyamp/FuzzyRule = ^l n
Config/Penkyamp/FuzzyRule = ^n l
則輸入"la"可列出讀若 la na 的所有單字。反之亦然。
Config/Penkyamp/FuzzyRule = ^([jcs]).*$ \1
這個模式裡,有機種正則表達式的特殊符號。
[ ] 括起的一組字母,匹配時可任選其一;
( ) 起分組作用(見下文);
. 代表任意字符;
* 代表前面的 . 數量有任意個(含0個);
$ 和 ^ 意義相對,表示模式還要匹配到拼式末尾,即該模式必須恰好匹配完整個拼式。
替換內容中,\1 代表模式中的第一組 ( ) 匹配到的文字,即聲母 j c s 之一。
整個規則的作用是實現以 j c s 代表所有以該字母為首的拼式,即俗稱的「簡拼」;實質上是模糊音的一種。

為Penkyamp拼寫法,佛振總結出以下一組規則(順序很重要)。

# 以 # 啟始的行為註釋行
# 我的辦法是以 a' e' o' 表示三組長短對立元音中的短元音,好從元音中析取出短元音因素 ' 來韻尾一起做變換
# aa -> a ; a -> a'
Config/Penkyamp/SpellingRule = aa A
Config/Penkyamp/SpellingRule = a a'
Config/Penkyamp/SpellingRule = A a

Config/Penkyamp/SpellingRule = eu$ eau

# e'
Config/Penkyamp/SpellingRule = ei$ e'i
Config/Penkyamp/SpellingRule = ing$ e'ng
Config/Penkyamp/SpellingRule = ik$ e'k

# o'
Config/Penkyamp/SpellingRule = ung$ o'ng
Config/Penkyamp/SpellingRule = uk$ o'k
Config/Penkyamp/SpellingRule = ou$ o'u
Config/Penkyamp/SpellingRule = eo o'

Config/Penkyamp/SpellingRule = oe eo

Config/Penkyamp/SpellingRule = yu eu

# 用韻尾標示短元音
Config/Penkyamp/SpellingRule = ([aeiou])'$ \1h
Config/Penkyamp/SpellingRule = ([aeiou])'i$ \1y
Config/Penkyamp/SpellingRule = ([aeiou])'u$ \1w
Config/Penkyamp/SpellingRule = ([aeiou])'m$ \1mp
Config/Penkyamp/SpellingRule = ([aeiou])'n$ \1nt
Config/Penkyamp/SpellingRule = ([aeiou])'ng$ \1nk

# 長元音,入聲韻尾改為 bdg
Config/Penkyamp/SpellingRule = ([aeiou])p$ \1b
Config/Penkyamp/SpellingRule = ([aeiou])t$ \1d
Config/Penkyamp/SpellingRule = ([aeiou])k$ \1g
# 短元音,入聲韻尾仍作 ptk
Config/Penkyamp/SpellingRule = '([ptk])$ \1

# 聲母
Config/Penkyamp/SpellingRule = ^([gk])w \1u
# 注意順序
Config/Penkyamp/SpellingRule = ^j y
Config/Penkyamp/SpellingRule = ^z j

# 兼容拼式:z = j, gw... = gu..., kw... = ku..., 但 gu, ku 不能只寫 gw, kw
Config/Penkyamp/FuzzyRule = ^j z
Config/Penkyamp/FuzzyRule = ^([gk])u([aeo]) \1w\2

[ 本帖最後由 佛振 於 2010-1-11 20:50 編輯 ]
 樓主| 發表於 2010-1-11 21:12:55 | 顯示全部樓層
剩下的 Punct 和 EditKey 兩節照抄即可。見上文 jyutping-schema.txt 中的代碼。
把作用解釋一下:

Punct 定義標點符號。有三類:
像逗號、句號這類,直接打定義在空格左邊那個鍵盤字符,便得到定義在空格右邊的中文標點;
像引號這類,想要用一個鍵 " 輪換打出成對的左右引號,那麼在把左右引號都寫在空格右邊,中間放一個西文字符~;
再一種,由於鍵盤上鍵少而標點符號種類多,多的我把他都安在一個鍵上,反覆敲鍵來變換符號,類似用手機鍵盤打英文字母的方法。可能是佛振的獨創喔。

EditKey 是定義附加的編輯功能鍵。通常用上下左右、PgUp、PgDn來完成光標移動和換頁操作,但這些鍵遠離主鍵盤區,使用不方便嘛,用過 vi 編輯器的都有同感。因為在選字模式下一些符號鍵甚至字母鍵都是不響應輸入的,佛振以為用它們來代替那些編輯功能鍵最好不過了。
譬如把逗號、句號映射到PgUp、PgDn,就是很多輸入法的標準配置。佛振更是喜歡以大寫字母 I K J L 替代上下左右,如此在整個輸入過程中手完全不用離開基準鍵位。可能不是獨創;但真的,可以讓你隨心所欲地編輯這組功能鍵。(EditKey 只在ibus-zime中有實現)

至此,penkyamp-schema.txt 完成了,它和 jyutping-keywords.txt、jyutping-phrases.txt 一起便構成一款新的ZIME輸入方案!

[ 本帖最後由 佛振 於 2010-1-11 21:16 編輯 ]
 樓主| 發表於 2010-1-11 21:29:24 | 顯示全部樓層
最後一步,編譯新的輸入方案。需要用到 Python 程式語言和輸入法軟件的 data/ 目錄中的工具。
把前面製作的三個文本文件放到 data/ 目錄裡頭。
在控制台上(Windows用戶請打開一個命令提示符窗口)敲命令:

cd 輸入平臺軟件Plume.js之所在文件夾
cd data
python make-json.py -v penkyamp-schema.txt jyutping-keywords.txt jyutping-phrases.txt

相似地,在Linux系統下為 ibus-zime 配置此款輸入方案,敲:

cd ibus-zime之所在路徑
cd data
python create-schema.py -v penkyamp-schema.txt jyutping-keywords.txt jyutping-phrases.txt

倘一切正常,腳本顯示"done.";再次打開輸入法,voila ! 多出一款新的方案。

[ 本帖最後由 佛振 於 2010-1-11 22:01 編輯 ]
 樓主| 發表於 2010-1-11 21:47:29 | 顯示全部樓層
佛振完成的Penkyamp方案可在此下載:http://zime.googlecode.com/svn/trunk/zime-data/jyutping/penkyamp-schema.txt

自己製作方案時,如何調試SpellingRule和FuzzyRule?
編譯的時候,除了進行拼寫運算,還要依據推算出的拼式來生成整個詞庫。編譯出的結果在一個名為 json/ 的文件夾下。
其中 PenkyampConfig.json 文件記載著所有新的拼式與原方案(Jyutping)拼式的對應關係,以及所有兼容拼式(如 zonk)與標準拼式(jonk)的對應關係。

為查看所有結果拼式是否正確,編譯時在 make-json.py 後添加選項 -k -p,使其略過生成詞庫的冗長過程,僅生成以上文件,並以可讀的格式呈現。
待規則定義無誤,再用上文的方法做一次標準編譯。

發表於 2010-1-12 00:58:07 | 顯示全部樓層
網頁版照理在繁體系統上應該亦可正常使用,本人亦已經證明事實的確如此。自定輸入法方面再行慢慢消化,感謝樓主的工作。 [ 本帖最後由 JUMPSEY 於 2010-1-12 01:00 編輯 ]
 樓主| 發表於 2010-1-12 09:11:22 | 顯示全部樓層
原帖由 JUMPSEY 於 2010-1-12 00:58 發表 網頁版照理在繁體系統上應該亦可正常使用,本人亦已經證明事實的確如此。自定輸入法方面再行慢慢消化,感謝樓主的工作。


是的,開發時所有資料採用了UTF-8編碼格式,應當能在各主要平臺通行。

考慮到各位朋友剛剛接觸這輸入法,自定義尚有難度,今已打包編譯好的Penkyamp輸入方案,在ZIME計劃網站提供下載:

http://zime.googlecode.com/files/plume-1.1.zip
http://zime.googlecode.com/files/plume-1.1-data-penkyamp.zip
發表於 2010-1-12 16:50:35 | 顯示全部樓層

由衷感激佛振。是广东人都应该多谢你。


我希望听听 xiss 的意见看看怎么写一个简短的 penkyamp 输入法入门,让所有安装中州Penkyamp软件成功的,但从来未接触过penkyamp的人能够快快手学识用 penkyamp 打汉字。

xiss 是一个写方案介绍文的能手,可以帮我开启很多计仔。



http://bbs.cantonese.asia/viewthread.php?tid=20465

Penkyamp 输入汉字软件可以下载了


[ 本帖最後由 penkyamp 於 2010-1-13 02:45 編輯 ]
 樓主| 發表於 2010-1-15 21:08:54 | 顯示全部樓層
今日更新了軟件。

Plume.js 2.0
方案定義文件採用了新的規範(ZIME Schema Specification V3),更加清晰易讀易修改;
完全支持「拼寫運算」機制,基於相同音系的各種拼寫法可共用一套詞庫;
增加了table解析方式,可實現雙拼、形碼連打輸入。

http://zime.googlecode.com/
發表於 2010-3-16 00:39:56 | 顯示全部樓層
我现在用的是fedora 12 64位版本,ibus是系统自带的,make install ibus-zime-3.3 版本时提示「ibus-engine-zime /usr/lib/ibus/ibus-engine-zime找不到,」 修改成「cp ibus-engine-zime /usr/lib/python2.6/site-packages/ibus/ibus-engine-zime「后重启ibus,选项里面可以找到zime,添加后,使用时调不出来,调的时候还卡一小下。。。刚用这个系统,很不熟练,麻烦大家帮下手。
 樓主| 發表於 2010-3-16 10:52:15 | 顯示全部樓層
抱歉啦,我这安装脚本一直是以Ubuntu做测试,今查得Fedora的IBus包使用的路径不同:
Ubuntu: /usr/lib/ibus/
Fedora: /usr/libexec/
这需要修改 Makefile 及 zime.xml 两个文件中的相关路径。

如果不介意路径与其他Ibus组件不统一,更快的办法是手动建立目录 /usr/lib/ibus 再执行安装:
sudo mkdir -p /usr/lib/ibus
sudo make install
免得修改文件。

请试试看吧。
發表於 2010-3-19 08:31:58 | 顯示全部樓層
恩,搞定了,佛兄好热情啊,输入法也很不错,我正在学习。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|粵語協會

GMT+8, 2024-4-28 00:04 , Processed in 0.070814 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表